//
//  HMStatusDAL.swift
//  CZWeibo31
//
//  Created by apple on 16/8/22.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
/*
- 数据处理层
    - 该类作用
        - 保存数据
        - 查询数据
        - 检查本地是否有缓存数据
        - 删除数据
        - 网路请求数据
*/
class HMStatusDAL: NSObject {
    
    
    /*
        - 01 检查本地是否有缓存数据
            - 查询数据
            - 如果有 直接使用
            - 如果没有 网络请求
                - 把网络请求回来的数据保存到数据库中
    
    */
    
    // 检查本地是否有缓存数据(拿本地数据或者网络数据)
    class func checkOutCache(sinceId:Int64, maxId:Int64, finish:(res:[[String: AnyObject]]?)->()) {
        // 获取缓存数据
        let result = HMStatusDAL.getCache(sinceId, maxId: maxId)
        // 代表有缓存数据 直接把本地数据返回
        if result?.count > 0 {
            print("-------本地获取微博缓存数据")
            finish(res: result)
        }else{
            print("-------网络获取微博缓存数据")
            // 没有缓存数据 需要网络请求
            HMNetworkTools.sharedTools.homeLoadData(sinceId, maxId: maxId, success: { (response) -> () in
                
                // 判断response 是否为nil  而且是否可以转成一个数组
                guard let res = response?["statuses"] as? [[String: AnyObject]] else{
                    finish(res: nil)
                    return
                }
                // 保存网络数据到本地
                HMStatusDAL.saveCache(res)
                finish(res: res)
                
                }, failure: { (error) -> () in
                    print("请求微博数据失败")
                    finish(res: nil)
            })
        }
    }
    
    // 查询微博数据
    class func getCache(sinceId:Int64, maxId:Int64) -> [[String: AnyObject]]?{
        // 如果为nil 代表没有登录
        guard let userId = HMUserAccountViewModel.sharedTools.userAccount?.uid else{
            return nil
        }
        // 如果他们全为nil 就代表是第一次请求数据 需要从网络中请求数据
        if sinceId == 0 && maxId == 0 {
            return nil
        }
        
        // 准备sql
        var sql = ""
        sql += "SELECT * FROM T_Status\n"
        sql += "WHERE userid=\(userId)\n"
        // 下拉刷新
        if sinceId > 0 {
            sql += "AND statusid>\(sinceId)\n"
            
        }
        // 上拉加载更多
        if maxId > 0 {
            sql += "AND statusid<=\(maxId)\n"
        }
        sql += "ORDER BY statusid DESC\n"
        sql += "LIMIT 20"
        // 执行sql
        let result = HMSQLManager.sharedTools.executeRecordForSql(sql)
        // 创建一个临时可变的数组
        var tempArray:[[String: AnyObject]] = [[String: AnyObject]]()
        // 遍历数组
        for dic in result {
            // 得到微博的二进制
            let data = dic["status"] as! NSData
            
            // 二进制转字典
            let dict = try! NSJSONSerialization.JSONObjectWithData(data, options: [])
            
            // 保存字典
            tempArray.append(dict as! [String: AnyObject])
        }
        return tempArray
    }
    
    
    // 保存微博数据
    class func saveCache(response:[[String: AnyObject]]) {
        // 用户uid
        guard let userId = HMUserAccountViewModel.sharedTools.userAccount?.uid else{
            return
        }
        /*
            userid=1234  statusid = 100
            userid=1234  statusid = 100
            // 防止数据重复 使用 REPLACE
        */
        // 准备sql
        let sql = "INSERT OR REPLACE INTO T_Status (status,statusid,userid) VALUES (?,?,?)"
        
        // 执行sql
        HMSQLManager.sharedTools.queue.inTransaction { (db, rollback) -> Void in
            // 循环
            for dic in response {
                // 微博id
                let statusId = dic["id"] as! NSNumber
                // 微博二进制数据
                let data = try! NSJSONSerialization.dataWithJSONObject(dic, options: [])
                if db.executeUpdate(sql, withArgumentsInArray: [data,statusId,userId]) {
                    print("保存微博数据成功")
                }else {
                    print("保存微博数据失败")
                    // 执行回滚
                    rollback.memory = true
                }
            }
        }
    }
    // 删除微博缓存数据(关于数据库的缓存 不要交给用户来管理 需要程序员来自己管理)
    class func deleteCache() {
//        // 删除数据时间
//        let date = NSDate().dateByAddingTimeInterval(-60*60*2)
//        // 2016-08-22 11:58:52
//        let df = NSDateFormatter()
//        df.locale = NSLocale(localeIdentifier: "en_US")
//        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let timeStr = NSDate.deleteSinaTime()
        // 准备sql
        let sql = "DELETE FROM T_Status WHERE createtime<'\(timeStr)'"
        // 执行sql
        HMSQLManager.sharedTools.queue.inDatabase { (db) -> Void in
            if db.executeUpdate(sql, withArgumentsInArray: nil) {
                print("删除微博缓存数据成功")
            }else {
                print("删除微博缓存数据失败")
            }
        }
    }
}












